package com.frejoys.service.impl;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollectionUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.frejoys.common.dto.common.PageDto;
import com.frejoys.common.enums.EStatus;
import com.frejoys.common.util.AppConfigUtil;
import com.frejoys.common.vo.admin.UserLevelAgentVo;
import com.frejoys.common.vo.agent.AgentUserInfoVo;
import com.frejoys.common.vo.app.UserLevelVo;
import com.frejoys.dao.entity.User;
import com.frejoys.dao.entity.UserLevelAgent;
import com.frejoys.dao.mapper.UserLevelAgentMapper;
import com.frejoys.dao.mapper.UserMapper;
import com.frejoys.service.UserLevelAgentService;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;

import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;

@Service
@RequiredArgsConstructor
public class UserLevelAgentServiceImpl extends ServiceImpl<UserLevelAgentMapper, UserLevelAgent> implements UserLevelAgentService {

    private final UserMapper userMapper;

    @Override
    public UserLevelAgent getParentInfo(Long childUserId) {
        LambdaQueryWrapper<UserLevelAgent> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(UserLevelAgent::getChildUserId, childUserId);
        return getOnly(wrapper);
    }

    /**
     * 根据组id获取组所在代理人信息
     *
     * @param userId
     */
    @Override
    public List<AgentUserInfoVo> getAgentUser(Long userId) {
        LambdaQueryWrapper<UserLevelAgent> wrapper = Wrappers.lambdaQuery();
        wrapper.select(UserLevelAgent::getChildUserId).eq(UserLevelAgent::getUserId, userId);
        List<UserLevelAgent> userLevelAgents = baseMapper.selectList(wrapper);

        //获取推荐用户id
        List<Long> childUserIds = userLevelAgents.stream().map(UserLevelAgent::getChildUserId).toList();
        if (CollectionUtil.isNotEmpty(childUserIds)) {
            List<AgentUserInfoVo> agentUserInfoVos = new ArrayList<>();
            LambdaQueryWrapper<User> userWrapper = Wrappers.lambdaQuery();
            userWrapper.select(User::getId, User::getNickname, User::getAvatar, User::getPhone)
                    .eq(User::getStatus, EStatus.on.getValue()).in(User::getId, childUserIds);
            List<User> users = userMapper.selectList(userWrapper);
            for (User u : users) {
                AgentUserInfoVo infoVo = new AgentUserInfoVo();
                BeanUtils.copyProperties(u, infoVo);
                infoVo.setUserId(u.getId());
                agentUserInfoVos.add(infoVo);
            }
            return agentUserInfoVos;
        }

        return Collections.emptyList();
    }


//    //代理人推广信息一级 层级
//    @Override
//    public List<UserLevelVo> oneUserAgentInfo(Long userId, PageDto dto) {
//        Page page = new Page<>(dto.getPage(), dto.getSize());
//        page.setSearchCount(false);
//
//        List<UserLevelVo> list = new ArrayList<>();
//
//        LambdaQueryWrapper<UserLevelAgent> wrapper = new LambdaQueryWrapper();
//        wrapper.eq(UserLevelAgent::getUserId, userId);
//
//        List<UserLevelAgent> userLevelPromotions = baseMapper.selectPage(page, wrapper).getRecords();
//        if (!userLevelPromotions.isEmpty()) {
//            List<Long> userIds = userLevelPromotions.stream().map(UserLevelAgent::getChildUserId).toList();
//
//            //查询用户 头像昵称
//            List<User> users = userMapper.getUserList(userIds, EStatus.on.getValue());
//            if (!users.isEmpty()) {
//                users.forEach(user -> {
//                    UserLevelVo vo = new UserLevelVo();
//                    vo.setNickname(user.getNickname());
//                    vo.setAvatar(AppConfigUtil.getUrlPrefix(user.getAvatar()));
//                    vo.setId(user.getId());
//                    list.add(vo);
//                });
//            }
//        }
//        return list;
//    }
//
//
//    //代理人推广信息二级 层级
//    @Override
//    public List<UserLevelVo> twoUserAgentInfo(Long userId, PageDto dto) {
//        Page page = new Page<>(dto.getPage(), dto.getSize());
//        page.setSearchCount(false);
//
//        List<UserLevelVo> list = new ArrayList<>();
//
//        LambdaQueryWrapper<UserLevelAgent> wrapper = new LambdaQueryWrapper();
//        wrapper.eq(UserLevelAgent::getParentUserId, userId);
//
//        List<UserLevelAgent> userLevelPromotions = baseMapper.selectPage(page, wrapper).getRecords();
//        if (!userLevelPromotions.isEmpty()) {
//            List<Long> userIds = userLevelPromotions.stream().map(UserLevelAgent::getChildUserId).toList();
//
//            //查询用户 头像昵称
//            List<User> users = userMapper.getUserList(userIds, EStatus.on.getValue());
//
//            if (!users.isEmpty()) {
//                users.forEach(user -> {
//                    UserLevelVo vo = new UserLevelVo();
//                    vo.setNickname(user.getNickname());
//                    vo.setAvatar(AppConfigUtil.getUrlPrefix(user.getAvatar()));
//                    vo.setId(user.getId());
//                    list.add(vo);
//                });
//            }
//        }
//        return list;
//    }


//    @Override
//    public IPage<UserLevelAgentVo> userLevelAgentListInfo(PageDto dto) {
//        Page page = new Page<>(dto.getPage(), dto.getSize());
//
//        LambdaQueryWrapper<UserLevelAgent> wrapper = new LambdaQueryWrapper<>();
//        wrapper.orderByDesc(UserLevelAgent::getCreateTime);
//        Page<UserLevelAgent> userLevelAgents = baseMapper.selectPage(page,wrapper);
//        List<UserLevelAgent> parentList = userLevelAgents.getRecords();
//
//        List<UserLevelAgentVo> list = new ArrayList<>();
//
//        if (!parentList.isEmpty()){
//
//            List<Long>  userIds = parentList.stream().map(UserLevelAgent::getUserId).toList();
//            List<Long> childUserIds = parentList.stream().map(UserLevelAgent::getChildUserId).toList();
//            List<Long> parentUserIds = parentList.stream().map(UserLevelAgent::getParentUserId).toList();
//
//            //将三组id放到一个list查询用户信息
//            List<Long> ids = Stream.of(userIds, childUserIds, parentUserIds).flatMap(List::stream).distinct().collect(Collectors.toList());
//            LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
//            queryWrapper.select(User::getId,User::getAvatar,User::getPhone,User::getNickname)
//                    .in(User::getId,ids);
//            List<User> users = userMapper.selectList(queryWrapper);
//            Map<Long, User> userMap = users.stream().collect(Collectors.toMap(User::getId, u -> u));
//
//            parentList.forEach(userLevelAgent -> {
//
//                if (userMap.containsKey(userLevelAgent.getChildUserId())){
//                    UserLevelAgentVo vo = new UserLevelAgentVo();
//                    User user = userMap.get(userLevelAgent.getChildUserId());
//                    vo.setId(userLevelAgent.getId());
//                    vo.setCreateTime(userLevelAgent.getCreateTime());
//                    vo.setUserId(user.getId());
//                    vo.setNickname(user.getNickname());
//                    vo.setPhone(user.getPhone());
//                    vo.setAvatar(AppConfigUtil.getUrlPrefix(user.getAvatar()));
//
//                    if (userMap.containsKey(userLevelAgent.getUserId())){
//                        List<UserLevelAgentVo> vos = new ArrayList<>();
//                        UserLevelAgentVo agentVo = new UserLevelAgentVo();
//                        User u = userMap.get(userLevelAgent.getUserId());
//                        agentVo.setId(userLevelAgent.getId());
//                        agentVo.setCreateTime(userLevelAgent.getCreateTime());
//                        agentVo.setUserId(u.getId());
//                        agentVo.setNickname(u.getNickname());
//                        agentVo.setPhone(u.getPhone());
//                        agentVo.setAvatar(AppConfigUtil.getUrlPrefix(u.getAvatar()));
//                        vos.add(agentVo);
//                        vo.setChildren(vos);
//
//                        if (userMap.containsKey(userLevelAgent.getParentUserId()) && userLevelAgent.getParentUserId() != 0){
//                            List<UserLevelAgentVo> voList = new ArrayList<>();
//                            UserLevelAgentVo levelAgentVo = new UserLevelAgentVo();
//                            User us = userMap.get(userLevelAgent.getParentUserId());
//                            levelAgentVo.setId(userLevelAgent.getId());
//                            levelAgentVo.setCreateTime(userLevelAgent.getCreateTime());
//                            levelAgentVo.setUserId(us.getId());
//                            levelAgentVo.setNickname(us.getNickname());
//                            levelAgentVo.setPhone(us.getPhone());
//                            levelAgentVo.setAvatar(AppConfigUtil.getUrlPrefix(us.getAvatar()));
//                            voList.add(levelAgentVo);
//                            agentVo.setChildren(voList);
//                        }
//                    }
//                    list.add(vo);
//                }
//            });
//        }
//        IPage<UserLevelAgentVo> userLevelAgentPage = userLevelAgents.convert(userLevelAgent -> BeanUtil.copyProperties(userLevelAgent, UserLevelAgentVo.class));
//        userLevelAgentPage.setRecords(list);
//        return userLevelAgentPage;
//    }


}
